home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / apps / 93 / applic / plot.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-01-15  |  5.2 KB  |  191 lines

  1. #include "stdio.h"
  2. #include "osbind.h"
  3. #include "gemdefs.h"
  4. #define TRUE 1
  5.  
  6. /*** GEM bindings ***/
  7.  
  8.         extern  int     gl_apid;
  9.         int  contrl[12], intin[128], ptsin[128], intout[128], ptsout[128];
  10.         int work_in[11], work_out[57];
  11.         int gem_handle;
  12.  
  13.         int points, xy[1200];
  14.         float max_x, max_y, min_x, min_y, xr[600], yr[600];
  15.         char title[80];
  16.         FILE *data;
  17.  
  18. main()
  19. {
  20.         int i;
  21.         char filename[64];
  22.  
  23.         /*** initialize GEM ***/
  24.  
  25.         appl_init();
  26.         for (i=0; i<10; work_in[i++]=1);
  27.         work_in[10]=0;
  28.         v_opnvwk(work_in, &gem_handle, work_out);
  29.  
  30.         while (TRUE)
  31.         {  if (!get_file(filename)) break;
  32.            data = fopen(filename, "r");
  33.            if (data == NULL)
  34.            {  printf("Could not open file %s\n", filename);
  35.               Bconin(2);
  36.               graf_mouse(M_ON, 0L);
  37.               return;
  38.            }
  39.            get_xy();
  40.            scale_xy();
  41.            plot_xy();
  42.            graf_mouse(M_ON, 0L);
  43.         }
  44.  
  45.         graf_mouse(M_ON, 0L);
  46. }
  47.  
  48. get_file(fullfilename) char fullfilename[64];
  49. {
  50.         int i, button_status, drive;
  51.         static char filename[15]={" "}, pathname[52]={" "};
  52.  
  53.         if (strcmp(pathname, " ") == 0)
  54.         {  drive = Dgetdrv();
  55.            pathname[0] = drive+'A';
  56.            pathname[1] = ':';
  57.            Dgetpath(&pathname[2], 0);
  58.            strcat(pathname, "\\*.DAT");
  59.         }
  60.  
  61.         graf_mouse(M_OFF, 0L); v_curhome(gem_handle); v_eeos(gem_handle);
  62.         graf_mouse(M_ON, 0L);
  63.         fsel_input(pathname, filename, &button_status);
  64.         graf_mouse(M_OFF, 0L); v_curhome(gem_handle); v_eeos(gem_handle);
  65.         if (button_status == NIL)
  66.         {  graf_mouse(M_ON, 0L);
  67.            return(FALSE);
  68.         }
  69.         for (i=strlen(pathname)-1;
  70.             (pathname[i] != '\\') && (pathname[i] != ':');
  71.             i--);
  72.         strncpy(fullfilename, pathname, ++i);
  73.         fullfilename[i] = '\0';
  74.         strcat(fullfilename, filename);
  75.         return(TRUE);
  76. }
  77.  
  78. get_xy()
  79. {
  80.         max_x = -8.0e28;
  81.         max_y = -8.0e28;
  82.         min_x = 8.0e28;
  83.         min_y = 8.0e28;
  84.  
  85.         fscanf(data, "%[^\n]", title);
  86.         points = 0;
  87.         while (fscanf(data, "%f %f", &xr[points], &yr[points]) == 2)
  88.         {  if (xr[points] > max_x) max_x = xr[points];
  89.            if (xr[points] < min_x) min_x = xr[points];
  90.            if (yr[points] > max_y) max_y = yr[points];
  91.            if (yr[points] < min_y) min_y = yr[points];
  92.            points++;
  93.         }
  94.         points--;
  95. }
  96.  
  97. scale_xy()
  98. {
  99.         int i;
  100.         float scale_x, scale_y;
  101.  
  102.         scale_x = 600 / (max_x - min_x);
  103.         scale_y = 360 / (max_y - min_y);
  104.         for (i=0; i<=points; i++)
  105.         {  xr[i] = (xr[i] - min_x) * scale_x + 40;
  106.            yr[i] = 360 - (yr[i] - min_y) * scale_y;
  107.         }
  108. }
  109.  
  110. plot_xy()
  111. {
  112.         int i, j, offset, point2, dummy;
  113.         static int border[8]={40, 0, 40, 360, 40, 360, 640, 360};
  114.  
  115.         j = 0;
  116.         for (i=0; i <= points; i++)
  117.         {  xy[j++] = xr[i];
  118.            xy[j++] = yr[i];
  119.         }
  120.         printf("\33E");
  121.         v_pline(gem_handle, 4, border);
  122.         vsm_type(gem_handle, 3);
  123.         vsm_height(gem_handle, 2);
  124.         point2 = points << 1;
  125.         for (offset=0; offset<point2; offset += 100)
  126.         {  if (offset+100 <= point2)
  127.            {  v_pmarker(gem_handle, 100, &xy[offset]);
  128.               v_pline(gem_handle, 100, &xy[offset]);
  129.            }
  130.            else
  131.            {  v_pmarker(gem_handle, (points+1) % 50, &xy[offset]);
  132.               v_pline(gem_handle, (points+1) % 50, &xy[offset]);
  133.            }
  134.         }
  135.  
  136.         label_axis();
  137.         Bconin(2);
  138. }
  139.  
  140. label_axis()
  141. {
  142.         static int x_axis[30]={40, 360, 80, 360, 120, 360, 160, 360, 200, 360,
  143.          240, 360, 280, 360, 320, 360, 360, 360, 400, 360, 440, 360, 480, 360,
  144.          520, 360, 560, 360, 600, 360};
  145.  
  146.         static int y_axis[26]={40, 0, 40, 30, 40, 60, 40, 90, 40, 120, 40, 150,
  147.          40, 180, 40, 210, 40, 240, 40, 270, 40, 300, 40, 330, 40, 360};
  148.  
  149.         int i, dummy;
  150.         char label[40];
  151.         float x_inc, y_inc;
  152.  
  153.         vsm_height(gem_handle, 2);
  154.         vsm_type(gem_handle, 2);
  155.         v_pmarker(gem_handle, 15, x_axis);
  156.         v_pmarker(gem_handle, 13, y_axis);
  157.  
  158.         vst_point(gem_handle, 0, &dummy, &dummy, &dummy, &dummy);
  159.         x_inc = (max_x - min_x) / 15;
  160.         y_inc = (max_y - min_y) / 13;
  161.  
  162.         for (i=0; i<15; i++)
  163.         {  format(min_x + x_inc * i, label);
  164.            v_gtext(gem_handle, 20 + i*40, 380, label);
  165.         }
  166.  
  167.         for (i=0; i<13; i++)
  168.         {  format(max_y - y_inc * (i+1), label);
  169.            v_gtext(gem_handle, 2, i*30, label);
  170.         }
  171.  
  172.         vst_point(gem_handle, 9, &dummy, &dummy, &dummy, &dummy);
  173.         i = ((80 - strlen(title)) >> 1) << 3;
  174.         v_gtext(gem_handle, i, 396, title);
  175.  
  176. }
  177.  
  178. format(x, label) float x; char label[];
  179. {
  180.         if (x<10.0)
  181.           sprintf(label, "%6.3f", x);
  182.         else if (x<100.0)
  183.           sprintf(label, "%6.2f", x);
  184.         else if (x<1000.0)
  185.           sprintf(label, "%6.1f", x);
  186.         else if (x<100000.0)
  187.           sprintf(label, "%6.0f", x);
  188.         else
  189.           sprintf(label, "%6.1e", x);
  190. }
  191.